表示時間的瞬間,通常以一天的日期和時間表示。
今天來介紹日期格式的使用方式。
DateTime 是一個 Struct 結構,表示某一個時間點,如現在這個時分秒、資料建立的那一天,也可以用來計算程式執行的時間。
建立一個 DateTime 可以透過 new 初始化,或者 DateTime 的靜態類別來產生。
透過 new 的方式,我們可以指定任何一天的任何一個時間點,如
var today = new DateTime (2018, 11, 3);
var todayNoon = new DateTime (2018, 11, 3, 12, 0, 0);
最常使用的為這兩種方法,給予年月日的 int 引數,以及給予年月日時分秒的 int 引數。
透過靜態屬性傳回的 DateTime,則只能選擇現在,如
var today = DateTime.Today;
var now = DateTime.Now;
因為是程式執行當下的系統時間,所以可以用來計算程式執行的時間點與時間差。
int now = DateTime.Now;
int year = now.Year;
int month = now.Month;
int day = now.Day;
int hour = now.Hour;
int minute = now.Minute;
int second = now.Second;
int millisecond = now.Millisecond;
DayOfWeek dayOfWeek = now.DayOfWeek;
int dayOfYear = now.DayOfYear;
這邊列出部分的屬性,其中 DayOfWeek 是一個 enum 值,是一個從星期日開始數到星期六的枚舉,可以得到 DateTime 是屬於一周中的禮拜幾,而 DayOfYear 則是屬於一年中的第幾天。
建立一個日期格式的目的,當然是做日期的計算,例如計算天數差異、是否符合特定的日期區間,或者上面提到的程式執行相關作業等。
日期格式的加減,用數字來進行加減,並傳回一個新的 DateTime 如
var now = DateTime.Now;
var tomorrow = now.AddDays (1);
var yesterday = now.AddDays (-1);
var add1hour = now.AddHours (1);
每一個代表時間的屬性都有對應的加減方法,可以看到只有一個相對的方法,藉由正負數來加減,比較常用的有建立某個月的最後一天時,如
var theLastDayOfNovember = new DateTime (2018, 12, 1).AddDays (-1);
藉由下一個月份的第一天往前推一天來取得,不然每一個月的天數不一樣,在初始化時,還要針對該月份做變動。
日期格式的相減,用另一個 DateTime 去做相減,傳回一個 TimeSpan,如
var startTime = DateTime.Now;
// do something...
System.Threading.Thread.Sleep (2 * 1000);
var endTime = DateTime.Now;
var spentTime = endTime.Subtract (startTime);
var totalSecond = spentTime.TotalSeconds;
這邊使用執行續的方法,讓程式等待 2 * 1000 毫秒,來假裝執行一個運算過程,並記錄花費時間。
題外話:TimeSpan 是一個以日為最大單位的時間格式。
用減的方式也可以直接使用 - 符號,如
var spentTime = endTime - startTime;
因為 Add 不能 DateTime + DateTime,而是 DateTime 以及 TimeSpan 相加,所以使用 + 時依然是 DateTime 以及 TimeSpan,所以不特別介紹。
當日期格式需要顯示在畫面時,就需要轉換成特定字串,像是最常見的 2018/11/03 格式,或者更多的格式時,都可以來使用 ToString 來進行,也有只印出年日月的方法 ToLongDateString、ToShortDateString
或者只印出時分秒的方法 ToLongTimeString、ToShortTimeString
,也可以客製化自己的時間格式,如 11/2018/03 這種奇怪格式,我們只需要在 ToString 帶入相關的引數,就可以替換成符合的成員了,如
var monthYearDay = DateTime.Now.ToString ("MM/yyyy/dd");
引數內容就請自行到官方查看,這邊就不列出相關內容了,
有些時候可能會要求顯示年份需以民國年的方式,因為 DateTime 無法繼承,所以我們用擴充方法的方式來擴充功能,這邊很簡單的示範如
class Program {
static void Main (string[] args) {
var nowTW = DateTime.Now.ToTWDate ("/MM/dd");
}
}
static class DateTimeExtensionMethods {
public static int ToTWYear (this DateTime dateTime) {
return dateTime.Year - 1911;
}
public static string ToTWDate (this DateTime dateTime, string MMdd) {
return dateTime.ToTWYear () + dateTime.ToString (MMdd);
}
}
多了一個傳回民國年的方法,以及傳回民國年組合的日期字串,不是什麼很好用的例子,只是舉例一下別忘了有擴充方法,即便無法更改原類別,我們還是可以多一些自己想要的方法。
今天介紹了基礎的日期格式用法,算是常用的類別之一,所以很簡單的說明如何去初始化,以及一些運算操作,順便回憶一下之前提到的擴充方法。
感謝閱讀。
參考連結
DateTime Struct (System) | Microsoft Docs
DateTime.ToString Method (System) | Microsoft Docs